"""
Excel生成服务
"""
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
from typing import List, Dict

class ExcelService:
    """Excel生成服务类"""
    
    @staticmethod
    def generate_excel(matches: List[Dict[str, str]], unmatched_files: List[str], output_path: str) -> None:
        """
        生成Excel文件
        
        Args:
            matches: 匹配结果列表，每个元素包含lib、path、filename
            unmatched_files: 未匹配的文件名列表
            output_path: 输出文件路径
        """
        wb = Workbook()
        ws = wb.active
        ws.title = "匹配结果"
        
        # 设置表头
        headers = ['lib包', '路径', '文件名']
        ws.append(headers)
        
        # 设置表头样式
        header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
        for cell in ws[1]:
            cell.font = Font(bold=True, color="FFFFFF")
            cell.alignment = Alignment(horizontal='center')
            cell.fill = header_fill
        
        # 添加匹配结果
        for match in matches:
            # 主jar包的lib包列显示为空（仅主jar包及其直接子jar包，如：主jar包/xxx.jar）
            # 更深层的嵌套jar（如：主jar包/lib/xxx.jar）应该保留显示
            lib_name = match['lib']
            if lib_name == '主jar包':
                lib_name = ''  # 主jar包列显示为空
            elif lib_name.startswith('主jar包/') and lib_name.count('/') == 1:
                # 直接子jar包（只有一层斜杠，如：主jar包/xxx.jar）
                lib_name = ''
            ws.append([lib_name, match['path'], match['filename']])
        
        # 添加未匹配的文件（仅文件名，其他列为空）
        if unmatched_files:
            # 添加分隔行（可选）
            ws.append([])
            ws.append(['未匹配的文件', '', ''])
            # 设置未匹配文件标题样式
            unmatched_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")
            for cell in ws[len(matches) + 3]:
                cell.fill = unmatched_fill
                cell.font = Font(bold=True)
            
            # 添加未匹配的文件名
            for filename in unmatched_files:
                ws.append(['', '', filename])
        
        # 保存Excel文件
        wb.save(output_path)

